// 线程回收函数 -> int pthread_join(pthread_t thread, void **retval) -> 每次只能回收一个子线程， 可借助第二个参数接收子线程传递的数据
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<pthread.h>

// 测试类
struct Test
{
    int num;
    int age;
};

void* callback(void* arg)
{
    printf("子线程:%ld\n", pthread_self());

    struct Test *t = (struct Test*)arg; // 强制类型转换
    t->num = 100;
    t->age = 6;

    pthread_exit(&t); // 线程退出，并将地址传给主线程的pthread_join()函数

    return NULL;
}

int main()
{
    pthread_t tid; 

    struct Test t;

    pthread_create(&tid, NULL, callback, &t); // 创建子线程

    printf("主线程:%ld\n", pthread_self());

    void* ptr;
    // ptr是一个传出参数, 在函数内部让这个指针指向一块有效内存
    // 这个内存地址就是pthread_exit() 参数指向的内存
    pthread_join(tid, &ptr); // 利用线程回收函数

    printf("num:%d, age:%d\n", t.num, t.age);

    pthread_exit(NULL);
    return 0;
}

/*
    主线程:140639633336128
    子线程:140639633331968
    num:100, age:6
*/